本文共 3462 字,大约阅读时间需要 11 分钟。
TextEdit * textEdit;QList< pair解释一下 textEdit是自己封装的输入框,继承于QTextEdit;>strArray;unordered_map urlIndex;
strArray中存储着将传入的完整字符串拆分成超链接和普通字符串后的字符串数组,true表示是超链接
urlIndex中存储了显示的文本中超链接中每一个字符对应着超链接的index.
QString CCLChatTextItemForm::GetlinkUrl(const QString &str){ return ""+str+"";}//#define LINK_RegulaString "((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"//将普通网址改为html文本,显示下划线样式 蓝色void CCLChatTextItemForm::SetTextContent(const QString &str){ QString content = str; QRegExp regexp(LINK_RegulaString); int pos = content.indexOf(regexp); while(pos>=0){ if(pos==0){ QString tmp = content.mid(0,regexp.matchedLength()); content = content.mid(regexp.matchedLength()); strArray.push_back(make_pair(tmp,true)); }else{ QString tmp1 = content.mid(0,pos); QString tmp2 = content.mid(pos,regexp.matchedLength()); content = content.mid(pos+regexp.matchedLength()); strArray.push_back(make_pair(tmp1,false)); strArray.push_back(make_pair(tmp2,true)); } pos = content.indexOf(regexp); } if(content.size()>0) strArray.push_back(make_pair(content,false)); for(int i=0;i//另外在textEdit中重写鼠标释放事件t = strArray.at(i); if(t.second == false) this->textEdit->setUcs4String(t.first); else{ int count = this->textEdit->toPlainText().size(); this->textEdit->append(this->GetlinkUrl(t.first)); int len = this->GetlinkUrl(t.first).size(); for(int j = count;j =0){ if(pos==0){ QString tmp = content.mid(0,regexp.matchedLength()); content = content.mid(regexp.matchedLength()); strArray.push_back(make_pair(tmp,true)); }else{ QString tmp1 = content.mid(0,pos); QString tmp2 = content.mid(pos,regexp.matchedLength()); content = content.mid(pos+regexp.matchedLength()); strArray.push_back(make_pair(tmp1,false)); strArray.push_back(make_pair(tmp2,true)); } pos = content.indexOf(regexp); } if(content.size()>0) strArray.push_back(make_pair(content,false)); for(int i=0;i t = strArray.at(i); if(t.second == false) this->textEdit->setUcs4String(t.first);//这段代码自己封装的 为了解析特殊表情,相当于settext else{ int count = this->textEdit->toPlainText().size(); this->textEdit->append(this->GetlinkUrl(t.first)); int len = this->GetlinkUrl(t.first).size(); for(int j = count;j
//别忘了在构造函数中和析构函数中设置鼠标跟踪属性this->setMouseTracking(true);void TextEdit::mouseReleaseEvent(QMouseEvent *){ int index = this->textCursor().anchor();//得到当前光标点击的位置在文本中的第几个 emit SignalOpenUrl(index);}connect(this->textEdit,SIGNAL(SignalOpenUrl(int)),this,SLOT(SlotlOpenUrl(int)));//连接void CCLChatTextItemForm::SlotlOpenUrl(int index){ if(urlIndex.find(index) == this->urlIndex.end() ) return; QString urlString = this->strArray.at(urlIndex[index]).first; QDesktopServices::openUrl(QUrl(urlString));}//处理 ,至此超链接功能就写完了,总体思路是拆分字符串,确定每个超链接字符的位置,然后根据光标摁下获得的位置来取得字符串,再用QDesktopServices::openUrl(QUrl(urlString));打开